package chapter11.section3;

/* 程序11-2d TransactionGenerator：业务发生器 */

import java.util.Random;

public class TransactionGenerator extends Thread {
    Account account;
    private final QueueMachine queue;

    public TransactionGenerator(QueueMachine queue, Account account) {
        super();
        this.queue = queue;
        this.account = account;
    }

    @Override
    public void run() {
        int lastBalance = account.getBalance();// 记录账户最后的正确余额
        Random rand = new Random();
        // 每次循环均生成一笔业务，加入到排队机中
        for (int i = 1; i <= 5; i++) {
            // 随机产生一笔业务的存取金额，从100到300(不含)之间
            int amount = 100 + rand.nextInt(200);
            /*
             * 之所以生成一个1000内的数字再对2求余，是希望获得0和1随机性更均匀 一些，这个随机数 用于随机获得业务类型
             */
            int tranType = rand.nextInt(1000) % 2;
            // 根据生成的存取金额和业务类型，创建一个业务实例，并把它加入到排队机中
            Transaction tran = new Transaction(i, account, amount, Transaction.tranTypes[tranType]);
            queue.add(tran);
            // 根据业务类型，计算新的账户余额
            System.out.println("生成一笔业务:" + tran);
            if (tran.getTranType().compareTo(Transaction.DEPOSIT) == 0) {
                lastBalance += amount;
            } else if (tran.getTranType().equals(Transaction.WITHDRAW)) {
                lastBalance -= amount;
            }
            /*
             * 每生成一笔业务，可以休眠100到300毫秒，当线程对象在休眠时，可能会被其 它线程通知中断，线程会监测到此中断异常，这里暂时不理会它
             */
            try {
                Thread.sleep(rand.nextInt(100 + 100 * rand.nextInt(3)));
            } catch (InterruptedException e) {
                System.out.println("业务生成器在休眠时被通知中断，但继续运行");
            }
        }
        System.out.println("所有业务生成结束，该账户最后余额是:" + lastBalance);
    }
}